package com.common.util;

import java.util.HashMap;

public class NumberFormat {
	
	private static java.util.Map<String, String> SmallToBigMap = new HashMap<String, String>();

	static {
	   SmallToBigMap.put(String.valueOf(0), "零");
	   SmallToBigMap.put(String.valueOf(1), "一");
	   SmallToBigMap.put(String.valueOf(2), "二");
	   SmallToBigMap.put(String.valueOf(3), "三");
	   SmallToBigMap.put(String.valueOf(4), "四");
	   SmallToBigMap.put(String.valueOf(5), "五");
	   SmallToBigMap.put(String.valueOf(6), "六");
	   SmallToBigMap.put(String.valueOf(7), "七");
	   SmallToBigMap.put(String.valueOf(8), "八");
	   SmallToBigMap.put(String.valueOf(9), "九");
	   SmallToBigMap.put(String.valueOf(10), "十");
	   SmallToBigMap.put(String.valueOf(100), "百");
	   SmallToBigMap.put(String.valueOf(1000), "千");
	   SmallToBigMap.put(String.valueOf(10000), "万");
	   SmallToBigMap.put(String.valueOf(100000000), "亿");
	}

	public static String format(String num) {

	   // 先将末尾的零去掉
	   String numString = String.valueOf(num).replaceAll(".[0]+$", "");
	   // 分别获取整数部分和小数部分的数字
	   String intValue;
	   String decValue = "";
	   if (numString.indexOf(".") != -1) {
	    intValue = String.valueOf(num).split("\\.")[0];
	    decValue = String.valueOf(num).split("\\.")[1];
	   } else {
	    intValue = String.valueOf(num);
	   }
	   // 翻译整数部分。
	   intValue = formatInteger(Integer.parseInt(String.valueOf(intValue)));
	   // 翻译小数部分
	   decValue = formatDecnum(decValue);
	   String resultString = intValue;
	   if(!decValue.equals(""))
	    resultString = resultString + "点" + decValue;

	   return resultString;
	}

	/**
	* 将阿拉伯整数数字翻译为汉语小写数字。 其核心思想是照中文的读法，从后往前每四个数字为一组。每一组最后要加上对应的单位，分别为万、亿等。
	* 每一组中从后往前每个数字后面加上对应的单位，分别为个十百千。 每一组中如果出现零千、零百、零十的情况下去掉单位。
	* 每组中若出现多个连续的零，则通读为一个零。 若每一组中若零位于开始或结尾的位置，则不读。
	* 
	* @param num
	* @return
	*/
	public static String formatInteger(int num) {
	   int unit = 10000;
	   int perUnit = 10000;
	   String sb = new String();
	   String unitHeadString = "";
	   while(num > 0){
	    int temp = num % perUnit;
	    sb = formatIntegerLess10000(temp) + sb;
	    // 判断是否以单位表示为字符串首位，如果是，则去掉，替换为零
	    if(!unitHeadString.equals(""))
	     sb = sb.replaceAll("^" + unitHeadString, "零");
	    num = num / perUnit;
	    if(num > 0)
	    {
	     // 如果大于当前单位，则追加对应的单位
	     unitHeadString = SmallToBigMap.get(String.valueOf(unit));
	     sb = unitHeadString + sb;
	    }
	    unit = unit * perUnit;
	   }
	   return sb;
	}

	/**
	* 将小于一万的整数转换为中文汉语小写
	* 
	* @param num
	* @return
	*/
	public static String formatIntegerLess10000(int num) {
	   StringBuffer sb = new StringBuffer();
	   for (int unit = 1000; unit > 0; unit = unit / 10) {
	    int _num = num / unit;
	    // 追加数字翻译
	    sb.append(SmallToBigMap.get(String.valueOf(_num)));
	    if (unit > 1 && _num > 0)
	     sb.append(SmallToBigMap.get(String.valueOf(unit)));
	    num = num % unit;
	   }
	   // System.out.println(sb.toString().replaceAll("[零]+",
	   // "零").replaceAll("^零", "").replaceAll("零$", ""));
	   // 先将连续的零联合为一个零，再去掉头部和末尾的零
	   return sb.toString().replaceAll("[零]+", "零").replaceAll("^零", "")
	   .replaceAll("零$", "");
	}

	public static String formatDecnum(String num){
	   StringBuffer sBuffer = new StringBuffer();
	   char[] chars = num.toCharArray();
	   for(int i = 0; i < num.length(); i ++){
	    sBuffer.append(SmallToBigMap.get(String.valueOf(chars[i])));
	   }
	  
	   return sBuffer.toString();
	}

	public static void main(String[] args) {
//	   NumberFormat.formatInteger(1000);
	   System.out.println(NumberFormat.format("123.123"));
	   System.out.println(NumberFormat.format("101"));
	   System.out.println(NumberFormat.format("1001"));
	   System.out.println(NumberFormat.format("10100"));
	   System.out.println(NumberFormat.format("1000000001.123"));
	   System.out.println(NumberFormat.format("4"));
	}


}
